#include "../headers/main.h"
#include "../headers/glossaire.h"


char creerCarte(char valeur, char couleur) {
    char carte = (valeur|couleur);
    return carte;
}

void trierCartes(char* cartes,char ordre) {
    assert( ( ordre == ORDRE_CROISSANT ) || ( ordre == ORDRE_DECROISSANT ) );
    int permutation = 1;
    int i;
    char tmp_carte = '\0';
    
    //Tri à bulles : dès qu'on rencontre une carte plus grande, on permute
    while (permutation > 0) {
        permutation = 0;
        
        for (i = 0;cartes[i+1] != '\0';i++) {
            
            if (
               ((ordre==ORDRE_CROISSANT) && (getValeur(cartes[i]) > getValeur(cartes[i+1]))) ||
               ((ordre==ORDRE_DECROISSANT) && (getValeur(cartes[i]) < getValeur(cartes[i+1])))
            ) {
                tmp_carte = cartes[i];
                cartes[i] = cartes[i+1];
                cartes[i+1] = tmp_carte;     
                permutation = 1;
            }            
        }
        
    }
    
}

char menuToVal(char menuval) {
    if (menuval == MENU_AS) { return AS; }
    if (menuval == MENU_ROI) { return ROI; }
    if (menuval == MENU_DAME) { return DAME; }
    if (menuval == MENU_VALET) { return VALET; }
    if (menuval == MENU_DIX) { return DIX; }
    if (menuval == MENU_NEUF) { return NEUF; }
    if (menuval == MENU_HUIT) { return HUIT; }
    if (menuval == MENU_SEPT) { return SEPT; }
    if (menuval == MENU_SIX) { return SIX; }
    if (menuval == MENU_CINQ) { return CINQ; }
    if (menuval == MENU_QUATRE) { return QUATRE; }
    if (menuval == MENU_TROIS) { return TROIS; }
    if (menuval == MENU_DEUX) { return DEUX; }
    printf("%c n'est pas une valeur de menu valide",menuval);
    assert(0);
    return 0;
}
unsigned char getValeur(char carte) {
    carte &= ~(1 << 0);
    carte &= ~(1 << 1);
    return carte;
}
char* getValeurs(char* main,int nb_cartes_main) {
    char* valeurs = malloc(nb_cartes_main*sizeof(char));
    int i;
    for (i=0;i<nb_cartes_main;i++) {
         valeurs[i] = getValeur(main[i]);
    }
    return valeurs;
}


char menuToCouleur(char menucouleur) {
    if (menucouleur == MENU_COEUR) { return COEUR; }
    if (menucouleur == MENU_CARREAU) { return CARREAU; }
    if (menucouleur == MENU_PIQUE) { return PIQUE; }
    if (menucouleur == MENU_TREFLE) { return TREFLE; }
    printf("%c n'est pas une couleur de menu valide",menucouleur);
    assert(0);
    return 0;
}
unsigned char getCouleur(char carte) {
    char couleur = '\0';
    if (carte & (1 << 0)) { couleur |= (1 << 0); }
    if (carte & (1 << 1)) { couleur |= (1 << 1); }
    return couleur;
}

char* getCouleurs(char* main,int nb_cartes_main) {
    char* couleurs = malloc(nb_cartes_main*sizeof(char));
    unsigned char i;
    for (i=0;i<nb_cartes_main;i++) {
        couleurs[i] = getCouleur(main[i]);
    }
    return couleurs;
}

void freeTabMains(char** tab) {
    unsigned long long i;
    for (i=0;tab[i]!=NULL;i++) {
        //debug_print_mains(*(tab[i]));
        free(tab[i]);
    }
    free(tab);
}

int mainContientCarte(char* main,char carte) {
    int i = 0;
    for (i = 0; main[i] != '\0'; i++) {
        if (main[i] == carte) return 1;        
    }
    return 0;
}

unsigned long long int factorielle(unsigned int n) {
    unsigned long long int fact = 1;
    unsigned short int cpt;

    for(cpt = 2; cpt <= n; cpt++) { fact *= cpt; }

    return fact;
}

unsigned long int getNbMainsAGenerer(int nb_cartes_total,int nb_cartes_connues) {
    unsigned long int nb_mains = 1;
    int nb1 = nb_cartes_total - 7 + nb_cartes_connues;
    int i;
    for (i=(nb1+1);i<=nb_cartes_total;i++) { nb_mains *= i; }
    nb_mains /= factorielle(7-nb_cartes_connues);    
    return nb_mains;
}
int getNbCartesConnues(int etape) {
    if (etape == PREFLOP) { return 2; }
    else if (etape == FLOP) { return 5; }
    else if (etape == TURN) { return 6; }
    else if (etape == RIVER) { return 7; }
    exit(1);
}

int getEtapePourNbCartes(int nb_cartes) {
    if (nb_cartes == 2) { return PREFLOP; }
    else if (nb_cartes == 5) { return FLOP; }
    else if (nb_cartes == 6) { return TURN; }
    else if (nb_cartes == 7) { return RIVER; }
    exit(1);   
}